Celem tej strony jest przedstawienie zaawansowanych przykładów użycia menedżera GUI PySide (istnieją strony towarzyszące: Podstawowe przykłady PySide oraz Średniozaawansowane przykłady PySide).
Korzystając z modułu PySide w FreeCAD, masz pełną kontrolę nad jego interfejsem. Możesz na przykład:
Jeżeli chcesz pracować nad interfejsem FreeCAD, pierwszą rzeczą, którą należy zrobić, jest utworzenie odniesienia do głównego okna FreeCAD:
import sys
from PySide import QtGui ,QtCore
app = QtGui.qApp
mw = FreeCADGui.getMainWindow()
Następnie możesz np. przeglądać wszystkie widżety interfejsu:
for child in mw.children():
print('widget name = ', child.objectName(), ', widget type = ', child)
Widżety w interfejsie Qt są zazwyczaj zagnieżdżone w "kontenerowych" widżetach, więc elementy potomne naszego głównego okna mogą same zawierać inne elementy potomne. W zależności od typu widżetu można wykonywać wiele różnych operacji. Sprawdź dokumentację API, aby zobaczyć, co jest możliwe.
Dodanie nowego widżetu, na przykład dockWidget (który można umieścić w jednym z bocznych paneli FreeCAD), jest proste:
myWidget = QtGui.QDockWidget()
mw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myWidget)
Następnie mógłbyś dodać coś bezpośrednio do nowego widżetu:
myWidget.setObjectName("my Nice New Widget")
myWidget.resize(QtCore.QSize(300,100)) # sets size of the widget
label = QtGui.QLabel("Hello World", myWidget) # creates a label
label.setGeometry(QtCore.QRect(2,50,200,24)) # sets its size
label.setObjectName("myLabel") # sets its name, so it can be found by name
Jednak preferowaną metodą jest utworzenie obiektu UI, który wykona całe ustawienie widżetu za jednym razem. Wielką zaletą jest to, że taki obiekt UI można stworzony graficznie za pomocą programu Qt Designer. Typowy obiekt wygenerowany przez Qt Designer wygląda tak:
class myWidget_Ui(object):
def setupUi(self, myWidget):
myWidget.setObjectName("my Nice New Widget")
myWidget.resize(QtCore.QSize(300,100).expandedTo(myWidget.minimumSizeHint())) # sets size of the widget
self.label = QtGui.QLabel(myWidget) # creates a label
self.label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size
self.label.setObjectName("label") # sets its name, so it can be found by name
def retranslateUi(self, draftToolbar): # built-in QT function that manages translations of widgets
myWidget.setWindowTitle(QtGui.QApplication.translate("myWidget", "My Widget", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("myWidget", "Welcome to my new widget!", None, QtGui.QApplication.UnicodeUTF8))
Aby go użyć, musisz tylko zastosować go do swojego nowo utworzonego widżetu w następujący sposób:
app = QtGui.qApp
FCmw = app.activeWindow()
myNewFreeCADWidget = QtGui.QDockWidget() # create a new dckwidget
myNewFreeCADWidget.ui = myWidget_Ui() # load the Ui script
myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # setup the ui
FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window
Kluczem do poprawnego załadowania pliku UI jest użycie pełnej ścieżki do pliku. Na przykład, Menedżer dodatków robi to w następujący sposób:
self.dialog = FreeCADGui.PySideUic.loadUi(os.path.join(os.path.dirname(__file__), "AddonManager.ui"))